home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / CodeWarrior Lite / Metrowerks C⁄C++ Lite / Headers / Universal Headers 2.0.1f / Slots.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-22  |  14.2 KB  |  506 lines  |  [TEXT/MMCC]

  1. /*
  2.      File:        Slots.h
  3.  
  4.      Contains:    Slot Manager Interfaces.
  5.  
  6.      Version:    Technology:    System 7.5
  7.                  Package:    Universal Interfaces 2.0 in “MPW Latest” on ETO #17
  8.  
  9.      Copyright:    © 1984-1995 by Apple Computer, Inc.
  10.                  All rights reserved.
  11.  
  12.      Bugs?:        If you find a problem with this file, use the Apple Bug Reporter
  13.                  stack.  Include the file and version information (from above)
  14.                  in the problem description and send to:
  15.                      Internet:    apple.bugs@applelink.apple.com
  16.                      AppleLink:    APPLE.BUGS
  17.  
  18. */
  19.  
  20. #ifndef __SLOTS__
  21. #define __SLOTS__
  22.  
  23.  
  24. #ifndef __TYPES__
  25. #include <Types.h>
  26. #endif
  27. /*    #include <ConditionalMacros.h>                                */
  28.  
  29. #ifndef __EVENTS__
  30. #include <Events.h>
  31. #endif
  32. /*    #include <Quickdraw.h>                                        */
  33. /*        #include <MixedMode.h>                                    */
  34. /*        #include <QuickdrawText.h>                                */
  35. /*    #include <OSUtils.h>                                        */
  36. /*        #include <Memory.h>                                        */
  37.  
  38. #ifndef __OSUTILS__
  39. #include <OSUtils.h>
  40. #endif
  41.  
  42. #ifndef __FILES__
  43. #include <Files.h>
  44. #endif
  45.  
  46. #ifdef __cplusplus
  47. extern "C" {
  48. #endif
  49.  
  50. #if PRAGMA_ALIGN_SUPPORTED
  51. #pragma options align=mac68k
  52. #endif
  53.  
  54. #if PRAGMA_IMPORT_SUPPORTED
  55. #pragma import on
  56. #endif
  57.  
  58.  
  59. enum {
  60.     fCardIsChanged                = 1,                            /*Card is Changed field in StatusFlags field of sInfoArray*/
  61.     fCkForSame                    = 0,                            /*For SearchSRT. Flag to check for SAME sResource in the table. */
  62.     fCkForNext                    = 1,                            /*For SearchSRT. Flag to check for NEXT sResource in the table. */
  63.     fWarmStart                    = 2,                            /*If this bit is set then warm start else cold start.*/
  64.     stateNil                    = 0,                            /*State*/
  65.     stateSDMInit                = 1,                            /*:Slot declaration manager Init*/
  66.     statePRAMInit                = 2,                            /*:sPRAM record init*/
  67.     statePInit                    = 3,                            /*:Primary init*/
  68.     stateSInit                    = 4,                            /*:Secondary init*/
  69. /* flags for spParamData */
  70.     fall                        = 0,                            /* bit 0: set=search enabled/disabled sRsrc's */
  71.     foneslot                    = 1,                            /*    1: set=search sRsrc's in given slot only */
  72.     fnext                        = 2                                /*    2: set=search for next sRsrc */
  73. };
  74.  
  75. /*
  76.         SlotIntServiceProcPtr uses register based parameters on the 68k and cannot
  77.         be written in or called from a high-level language without the help of
  78.         mixed mode or assembly glue.
  79.  
  80.             typedef pascal short (*SlotIntServiceProcPtr)(long sqParameter);
  81.  
  82.         In:
  83.          => sqParameter     A1.L
  84.         Out:
  85.          <= return value    D0.W
  86. */
  87.  
  88. #if GENERATINGCFM
  89. typedef UniversalProcPtr SlotIntServiceUPP;
  90. #else
  91. typedef Register68kProcPtr SlotIntServiceUPP;
  92. #endif
  93.  
  94. enum {
  95.     uppSlotIntServiceProcInfo = kRegisterBased
  96.          | RESULT_SIZE(SIZE_CODE(sizeof(short)))
  97.          | REGISTER_RESULT_LOCATION(kRegisterD0)
  98.          | REGISTER_ROUTINE_PARAMETER(1, kRegisterA1, SIZE_CODE(sizeof(long)))
  99. };
  100.  
  101. #if GENERATINGCFM
  102. #define NewSlotIntServiceProc(userRoutine)        \
  103.         (SlotIntServiceUPP) NewRoutineDescriptor((ProcPtr)(userRoutine), uppSlotIntServiceProcInfo, GetCurrentArchitecture())
  104. #else
  105. #define NewSlotIntServiceProc(userRoutine)        \
  106.         ((SlotIntServiceUPP) (userRoutine))
  107. #endif
  108.  
  109. #if GENERATINGCFM
  110. #define CallSlotIntServiceProc(userRoutine, sqParameter)        \
  111.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppSlotIntServiceProcInfo, (sqParameter))
  112. #else
  113. /* (*SlotIntServiceProcPtr) cannot be called from a high-level language without the Mixed Mode Manager */
  114. #endif
  115.  
  116. struct SlotIntQElement {
  117.     Ptr                                sqLink;                        /*ptr to next element*/
  118.     short                            sqType;                        /*queue type ID for validity*/
  119.     short                            sqPrio;                        /*priority*/
  120.     SlotIntServiceUPP                sqAddr;                        /*interrupt service routine*/
  121.     long                            sqParm;                        /*optional A1 parameter*/
  122. };
  123. typedef struct SlotIntQElement SlotIntQElement;
  124.  
  125. typedef SlotIntQElement *SQElemPtr;
  126.  
  127. struct SpBlock {
  128.     long                            spResult;                    /*FUNCTION Result*/
  129.     Ptr                                spsPointer;                    /*structure pointer*/
  130.     long                            spSize;                        /*size of structure*/
  131.     long                            spOffsetData;                /*offset/data field used by sOffsetData*/
  132.     Ptr                                spIOFileName;                /*ptr to IOFile name for sDisDrvrName*/
  133.     Ptr                                spsExecPBlk;                /*pointer to sExec parameter block.*/
  134.     long                            spParamData;                /*misc parameter data (formerly spStackPtr).*/
  135.     long                            spMisc;                        /*misc field for SDM.*/
  136.     long                            spReserved;                    /*reserved for future expansion*/
  137.     short                            spIOReserved;                /*Reserved field of Slot Resource Table*/
  138.     short                            spRefNum;                    /*RefNum*/
  139.     short                            spCategory;                    /*sType: Category*/
  140.     short                            spCType;                    /*Type*/
  141.     short                            spDrvrSW;                    /*DrvrSW*/
  142.     short                            spDrvrHW;                    /*DrvrHW*/
  143.     SInt8                            spTBMask;                    /*type bit mask bits 0..3 mask words 0..3*/
  144.     SInt8                            spSlot;                        /*slot number*/
  145.     SInt8                            spID;                        /*structure ID*/
  146.     SInt8                            spExtDev;                    /*ID of the external device*/
  147.     SInt8                            spHwDev;                    /*Id of the hardware device.*/
  148.     SInt8                            spByteLanes;                /*bytelanes from card ROM format block*/
  149.     SInt8                            spFlags;                    /*standard flags*/
  150.     SInt8                            spKey;                        /*Internal use only*/
  151. };
  152. typedef struct SpBlock SpBlock;
  153.  
  154. typedef SpBlock *SpBlockPtr;
  155.  
  156. struct SInfoRecord {
  157.     Ptr                                siDirPtr;                    /*Pointer to directory*/
  158.     short                            siInitStatusA;                /*initialization E*/
  159.     short                            siInitStatusV;                /*status returned by vendor init code*/
  160.     SInt8                            siState;                    /*initialization state*/
  161.     SInt8                            siCPUByteLanes;                /*0=[d0..d7] 1=[d8..d15]*/
  162.     SInt8                            siTopOfROM;                    /*Top of ROM= $FssFFFFx: x is TopOfROM*/
  163.     SInt8                            siStatusFlags;                /*bit 0 - card is changed*/
  164.     short                            siTOConst;                    /*Time Out C for BusErr*/
  165.     SInt8                            siReserved[2];                /*reserved*/
  166.     Ptr                                siROMAddr;                    /* addr of top of ROM */
  167.     SInt8                            siSlot;                        /* slot number */
  168.     SInt8                            siPadding[3];                /* reserved */
  169. };
  170. typedef struct SInfoRecord SInfoRecord;
  171.  
  172. typedef SInfoRecord *SInfoRecPtr;
  173.  
  174. struct SDMRecord {
  175.     ProcPtr                            sdBEVSave;                    /*Save old BusErr vector*/
  176.     ProcPtr                            sdBusErrProc;                /*Go here to determine if it is a BusErr*/
  177.     ProcPtr                            sdErrorEntry;                /*Go here if BusErrProc finds real BusErr*/
  178.     long                            sdReserved;                    /*Reserved*/
  179. };
  180. typedef struct SDMRecord SDMRecord;
  181.  
  182. struct FHeaderRec {
  183.     long                            fhDirOffset;                /*offset to directory*/
  184.     long                            fhLength;                    /*length of ROM*/
  185.     long                            fhCRC;                        /*CRC*/
  186.     SInt8                            fhROMRev;                    /*revision of ROM*/
  187.     SInt8                            fhFormat;                    /*format - 2*/
  188.     long                            fhTstPat;                    /*test pattern*/
  189.     SInt8                            fhReserved;                    /*reserved*/
  190.     SInt8                            fhByteLanes;                /*ByteLanes*/
  191. };
  192. typedef struct FHeaderRec FHeaderRec;
  193.  
  194. typedef FHeaderRec *FHeaderRecPtr;
  195.  
  196. struct SEBlock {
  197.     UInt8                            seSlot;                        /*Slot number.*/
  198.     UInt8                            sesRsrcId;                    /*sResource Id.*/
  199.     short                            seStatus;                    /*Status of code executed by sExec.*/
  200.     UInt8                            seFlags;                    /*Flags*/
  201.     UInt8                            seFiller0;                    /*Filler, must be SignedByte to align on odd boundry*/
  202.     UInt8                            seFiller1;                    /*Filler*/
  203.     UInt8                            seFiller2;                    /*Filler*/
  204.     long                            seResult;                    /*Result of sLoad.*/
  205.     long                            seIOFileName;                /*Pointer to IOFile name.*/
  206.     UInt8                            seDevice;                    /*Which device to read from.*/
  207.     UInt8                            sePartition;                /*The partition.*/
  208.     UInt8                            seOSType;                    /*Type of OS.*/
  209.     UInt8                            seReserved;                    /*Reserved field.*/
  210.     UInt8                            seRefNum;                    /*RefNum of the driver.*/
  211.     UInt8                            seNumDevices;                /* Number of devices to load.*/
  212.     UInt8                            seBootState;                /*State of StartBoot code.*/
  213.     SInt8                            filler;
  214. };
  215. typedef struct SEBlock SEBlock;
  216.  
  217. /*  Principle  */
  218.  
  219. #if !GENERATINGCFM
  220. #pragma parameter __D0 SReadByte(__A0)
  221. #endif
  222. extern pascal OSErr SReadByte(SpBlockPtr spBlkPtr)
  223.  TWOWORDINLINE(0x7000, 0xA06E);
  224.  
  225. #if !GENERATINGCFM
  226. #pragma parameter __D0 SReadWord(__A0)
  227. #endif
  228. extern pascal OSErr SReadWord(SpBlockPtr spBlkPtr)
  229.  TWOWORDINLINE(0x7001, 0xA06E);
  230.  
  231. #if !GENERATINGCFM
  232. #pragma parameter __D0 SReadLong(__A0)
  233. #endif
  234. extern pascal OSErr SReadLong(SpBlockPtr spBlkPtr)
  235.  TWOWORDINLINE(0x7002, 0xA06E);
  236.  
  237. #if !GENERATINGCFM
  238. #pragma parameter __D0 SGetCString(__A0)
  239. #endif
  240. extern pascal OSErr SGetCString(SpBlockPtr spBlkPtr)
  241.  TWOWORDINLINE(0x7003, 0xA06E);
  242.  
  243. #if !GENERATINGCFM
  244. #pragma parameter __D0 SGetBlock(__A0)
  245. #endif
  246. extern pascal OSErr SGetBlock(SpBlockPtr spBlkPtr)
  247.  TWOWORDINLINE(0x7005, 0xA06E);
  248.  
  249. #if !GENERATINGCFM
  250. #pragma parameter __D0 SFindStruct(__A0)
  251. #endif
  252. extern pascal OSErr SFindStruct(SpBlockPtr spBlkPtr)
  253.  TWOWORDINLINE(0x7006, 0xA06E);
  254.  
  255. #if !GENERATINGCFM
  256. #pragma parameter __D0 SReadStruct(__A0)
  257. #endif
  258. extern pascal OSErr SReadStruct(SpBlockPtr spBlkPtr)
  259.  TWOWORDINLINE(0x7007, 0xA06E);
  260. /*  Special  */
  261.  
  262. #if !GENERATINGCFM
  263. #pragma parameter __D0 SReadInfo(__A0)
  264. #endif
  265. extern pascal OSErr SReadInfo(SpBlockPtr spBlkPtr)
  266.  TWOWORDINLINE(0x7010, 0xA06E);
  267.  
  268. #if !GENERATINGCFM
  269. #pragma parameter __D0 SReadPRAMRec(__A0)
  270. #endif
  271. extern pascal OSErr SReadPRAMRec(SpBlockPtr spBlkPtr)
  272.  TWOWORDINLINE(0x7011, 0xA06E);
  273.  
  274. #if !GENERATINGCFM
  275. #pragma parameter __D0 SPutPRAMRec(__A0)
  276. #endif
  277. extern pascal OSErr SPutPRAMRec(SpBlockPtr spBlkPtr)
  278.  TWOWORDINLINE(0x7012, 0xA06E);
  279.  
  280. #if !GENERATINGCFM
  281. #pragma parameter __D0 SReadFHeader(__A0)
  282. #endif
  283. extern pascal OSErr SReadFHeader(SpBlockPtr spBlkPtr)
  284.  TWOWORDINLINE(0x7013, 0xA06E);
  285.  
  286. #if !GENERATINGCFM
  287. #pragma parameter __D0 SNextSRsrc(__A0)
  288. #endif
  289. extern pascal OSErr SNextSRsrc(SpBlockPtr spBlkPtr)
  290.  TWOWORDINLINE(0x7014, 0xA06E);
  291.  
  292. #if !GENERATINGCFM
  293. #pragma parameter __D0 SNextTypeSRsrc(__A0)
  294. #endif
  295. extern pascal OSErr SNextTypeSRsrc(SpBlockPtr spBlkPtr)
  296.  TWOWORDINLINE(0x7015, 0xA06E);
  297.  
  298. #if !GENERATINGCFM
  299. #pragma parameter __D0 SRsrcInfo(__A0)
  300. #endif
  301. extern pascal OSErr SRsrcInfo(SpBlockPtr spBlkPtr)
  302.  TWOWORDINLINE(0x7016, 0xA06E);
  303.  
  304. #if !GENERATINGCFM
  305. #pragma parameter __D0 SCkCardStat(__A0)
  306. #endif
  307. extern pascal OSErr SCkCardStat(SpBlockPtr spBlkPtr)
  308.  TWOWORDINLINE(0x7018, 0xA06E);
  309.  
  310. #if !GENERATINGCFM
  311. #pragma parameter __D0 SReadDrvrName(__A0)
  312. #endif
  313. extern pascal OSErr SReadDrvrName(SpBlockPtr spBlkPtr)
  314.  TWOWORDINLINE(0x7019, 0xA06E);
  315.  
  316. #if !GENERATINGCFM
  317. #pragma parameter __D0 SFindDevBase(__A0)
  318. #endif
  319. extern pascal OSErr SFindDevBase(SpBlockPtr spBlkPtr)
  320.  TWOWORDINLINE(0x701B, 0xA06E);
  321.  
  322. #if !GENERATINGCFM
  323. #pragma parameter __D0 SFindBigDevBase(__A0)
  324. #endif
  325. extern pascal OSErr SFindBigDevBase(SpBlockPtr spBlkPtr)
  326.  TWOWORDINLINE(0x701C, 0xA06E);
  327. /*  Advanced  */
  328.  
  329. #if !GENERATINGCFM
  330. #pragma parameter __D0 InitSDeclMgr(__A0)
  331. #endif
  332. extern pascal OSErr InitSDeclMgr(SpBlockPtr spBlkPtr)
  333.  TWOWORDINLINE(0x7020, 0xA06E);
  334.  
  335. #if !GENERATINGCFM
  336. #pragma parameter __D0 SPrimaryInit(__A0)
  337. #endif
  338. extern pascal OSErr SPrimaryInit(SpBlockPtr spBlkPtr)
  339.  TWOWORDINLINE(0x7021, 0xA06E);
  340.  
  341. #if !GENERATINGCFM
  342. #pragma parameter __D0 SCardChanged(__A0)
  343. #endif
  344. extern pascal OSErr SCardChanged(SpBlockPtr spBlkPtr)
  345.  TWOWORDINLINE(0x7022, 0xA06E);
  346.  
  347. #if !GENERATINGCFM
  348. #pragma parameter __D0 SExec(__A0)
  349. #endif
  350. extern pascal OSErr SExec(SpBlockPtr spBlkPtr)
  351.  TWOWORDINLINE(0x7023, 0xA06E);
  352.  
  353. #if !GENERATINGCFM
  354. #pragma parameter __D0 SOffsetData(__A0)
  355. #endif
  356. extern pascal OSErr SOffsetData(SpBlockPtr spBlkPtr)
  357.  TWOWORDINLINE(0x7024, 0xA06E);
  358.  
  359. #if !GENERATINGCFM
  360. #pragma parameter __D0 SInitPRAMRecs(__A0)
  361. #endif
  362. extern pascal OSErr SInitPRAMRecs(SpBlockPtr spBlkPtr)
  363.  TWOWORDINLINE(0x7025, 0xA06E);
  364.  
  365. #if !GENERATINGCFM
  366. #pragma parameter __D0 SReadPBSize(__A0)
  367. #endif
  368. extern pascal OSErr SReadPBSize(SpBlockPtr spBlkPtr)
  369.  TWOWORDINLINE(0x7026, 0xA06E);
  370.  
  371. #if !GENERATINGCFM
  372. #pragma parameter __D0 SCalcStep(__A0)
  373. #endif
  374. extern pascal OSErr SCalcStep(SpBlockPtr spBlkPtr)
  375.  TWOWORDINLINE(0x7028, 0xA06E);
  376.  
  377. #if !GENERATINGCFM
  378. #pragma parameter __D0 SInitSRsrcTable(__A0)
  379. #endif
  380. extern pascal OSErr SInitSRsrcTable(SpBlockPtr spBlkPtr)
  381.  TWOWORDINLINE(0x7029, 0xA06E);
  382.  
  383. #if !GENERATINGCFM
  384. #pragma parameter __D0 SSearchSRT(__A0)
  385. #endif
  386. extern pascal OSErr SSearchSRT(SpBlockPtr spBlkPtr)
  387.  TWOWORDINLINE(0x702A, 0xA06E);
  388.  
  389. #if !GENERATINGCFM
  390. #pragma parameter __D0 SUpdateSRT(__A0)
  391. #endif
  392. extern pascal OSErr SUpdateSRT(SpBlockPtr spBlkPtr)
  393.  TWOWORDINLINE(0x702B, 0xA06E);
  394.  
  395. #if !GENERATINGCFM
  396. #pragma parameter __D0 SCalcSPointer(__A0)
  397. #endif
  398. extern pascal OSErr SCalcSPointer(SpBlockPtr spBlkPtr)
  399.  TWOWORDINLINE(0x702C, 0xA06E);
  400.  
  401. #if !GENERATINGCFM
  402. #pragma parameter __D0 SGetDriver(__A0)
  403. #endif
  404. extern pascal OSErr SGetDriver(SpBlockPtr spBlkPtr)
  405.  TWOWORDINLINE(0x702D, 0xA06E);
  406.  
  407. #if !GENERATINGCFM
  408. #pragma parameter __D0 SPtrToSlot(__A0)
  409. #endif
  410. extern pascal OSErr SPtrToSlot(SpBlockPtr spBlkPtr)
  411.  TWOWORDINLINE(0x702E, 0xA06E);
  412.  
  413. #if !GENERATINGCFM
  414. #pragma parameter __D0 SFindSInfoRecPtr(__A0)
  415. #endif
  416. extern pascal OSErr SFindSInfoRecPtr(SpBlockPtr spBlkPtr)
  417.  TWOWORDINLINE(0x702F, 0xA06E);
  418.  
  419. #if !GENERATINGCFM
  420. #pragma parameter __D0 SFindSRsrcPtr(__A0)
  421. #endif
  422. extern pascal OSErr SFindSRsrcPtr(SpBlockPtr spBlkPtr)
  423.  TWOWORDINLINE(0x7030, 0xA06E);
  424.  
  425. #if !GENERATINGCFM
  426. #pragma parameter __D0 SDeleteSRTRec(__A0)
  427. #endif
  428. extern pascal OSErr SDeleteSRTRec(SpBlockPtr spBlkPtr)
  429.  TWOWORDINLINE(0x7031, 0xA06E);
  430. extern pascal OSErr OpenSlot(ParmBlkPtr paramBlock, Boolean async);
  431.  
  432. #if !GENERATINGCFM
  433. #pragma parameter __D0 OpenSlotSync(__A0)
  434. #endif
  435. extern pascal OSErr OpenSlotSync(ParmBlkPtr paramBlock)
  436.  ONEWORDINLINE(0xA200);
  437.  
  438. #if !GENERATINGCFM
  439. #pragma parameter __D0 OpenSlotAsync(__A0)
  440. #endif
  441. extern pascal OSErr OpenSlotAsync(ParmBlkPtr paramBlock)
  442.  ONEWORDINLINE(0xA600);
  443. /*  Device Manager Slot Support  */
  444.  
  445. #if !GENERATINGCFM
  446. #pragma parameter __D0 SIntInstall(__A0, __D0)
  447. #endif
  448. extern pascal OSErr SIntInstall(SQElemPtr sIntQElemPtr, short theSlot)
  449.  ONEWORDINLINE(0xA075);
  450.  
  451. #if !GENERATINGCFM
  452. #pragma parameter __D0 SIntRemove(__A0, __D0)
  453. #endif
  454. extern pascal OSErr SIntRemove(SQElemPtr sIntQElemPtr, short theSlot)
  455.  ONEWORDINLINE(0xA076);
  456.  
  457. #if !GENERATINGCFM
  458. #pragma parameter __D0 SVersion(__A0)
  459. #endif
  460. extern pascal OSErr SVersion(SpBlockPtr spBlkPtr)
  461.  TWOWORDINLINE(0x7008, 0xA06E);
  462.  
  463. #if !GENERATINGCFM
  464. #pragma parameter __D0 SetSRsrcState(__A0)
  465. #endif
  466. extern pascal OSErr SetSRsrcState(SpBlockPtr spBlkPtr)
  467.  TWOWORDINLINE(0x7009, 0xA06E);
  468.  
  469. #if !GENERATINGCFM
  470. #pragma parameter __D0 InsertSRTRec(__A0)
  471. #endif
  472. extern pascal OSErr InsertSRTRec(SpBlockPtr spBlkPtr)
  473.  TWOWORDINLINE(0x700A, 0xA06E);
  474.  
  475. #if !GENERATINGCFM
  476. #pragma parameter __D0 SGetSRsrc(__A0)
  477. #endif
  478. extern pascal OSErr SGetSRsrc(SpBlockPtr spBlkPtr)
  479.  TWOWORDINLINE(0x700B, 0xA06E);
  480.  
  481. #if !GENERATINGCFM
  482. #pragma parameter __D0 SGetTypeSRsrc(__A0)
  483. #endif
  484. extern pascal OSErr SGetTypeSRsrc(SpBlockPtr spBlkPtr)
  485.  TWOWORDINLINE(0x700C, 0xA06E);
  486.  
  487. #if !GENERATINGCFM
  488. #pragma parameter __D0 SGetSRsrcPtr(__A0)
  489. #endif
  490. extern pascal OSErr SGetSRsrcPtr(SpBlockPtr spBlkPtr)
  491.  TWOWORDINLINE(0x701D, 0xA06E);
  492.  
  493. #if PRAGMA_IMPORT_SUPPORTED
  494. #pragma import off
  495. #endif
  496.  
  497. #if PRAGMA_ALIGN_SUPPORTED
  498. #pragma options align=reset
  499. #endif
  500.  
  501. #ifdef __cplusplus
  502. }
  503. #endif
  504.  
  505. #endif /* __SLOTS__ */
  506.